#ifndef __VT100_H__
#define __VT100_H__

#include <iostream>

// ======================= 背景色枚举 =======================
typedef enum {
  BG_BLACK = 40,      ///< 黑色背景（图片原文：40：黑）
  BG_DARK_RED = 41,   ///< 深红背景（图片原文：41：深红）
  BG_GREEN = 42,      ///< 绿色背景（图片原文：42：绿）
  BG_YELLOW = 43,     ///< 黄色背景（图片原文：43：黄色）
  BG_BLUE = 44,       ///< 蓝色背景（图片原文：44：蓝色）
  BG_PURPLE = 45,     ///< 紫色背景（图片原文：45：紫色）
  BG_DARK_GREEN = 46, ///< 深绿背景（图片原文：46：深绿）
  BG_WHITE = 47,      ///< 白色背景（图片原文：47：白色）
  BG_EMPTY = 0
} BackgroundColor;

// ======================= 字体颜色枚举 =======================
typedef enum {
  FG_BLACK = 30,  ///< 黑色文字（图片原文：30：黑）
  FG_RED = 31,    ///< 红色文字（图片原文：31：红）
  FG_GREEN = 32,  ///< 绿色文字（图片原文：32：绿）
  FG_YELLOW = 33, ///< 黄色文字（图片原文：33：黄）
  FG_BLUE = 34,   ///< 蓝色文字（图片原文：34：蓝色）
  FG_PURPLE = 35, ///< 紫色文字（图片原文：35：紫色）
  FG_CYAN =
      36, ///< 青色文字（图片原文：36：漆缘，实际应为深绿，但标准ANSI中36是青色）
  FG_WHITE = 37, ///< 白色文字（图片原文：37：白色）
  FG_EMPTY = 0
} ForegroundColor;

/**
 * @brief VT100显示控制
 *
 */
class VT100 {
public:
  /**
   * @brief 设置光标
   *
   * @param x
   * @param y
   */
  static void VT100SetTheCursor(unsigned int x, unsigned int y) {
    std::cout << "\033[" << y << ";" << x << "H";
  }

  /**
   * @brief  设置颜色
   *
   * @param backgroundColor  背景色
   * @param fontColor        前景色
   */
  static void VT100SetColors(BackgroundColor backgroundColor,
                             ForegroundColor fontColor) {
    if (backgroundColor == BG_EMPTY) {
      std::cout << "\033[" << fontColor << "m";
    } else if (fontColor == FG_EMPTY) {
      std::cout << "\033[" << backgroundColor << "m";
    }
    std::cout << "\033[" << backgroundColor << ";" << fontColor << "m";
  }

  /**
   * @brief 清除之前设置
   *
   */
  static void VT100ClearTheConfiguration(void) { std::cout << "\033[0m"; }

  /**
   * @brief 清屏
   *
   */
  static void VT100CLear(void) { std::cout << "\033[2J"; }

  /**
   * @brief 闪烁
   *
   */
  static void VT100SetFlicker() { std::cout << "\033[5m"; }
};

#endif // __VT100_H__